home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / dev / sun4.md / devConsole.c < prev    next >
C/C++ Source or Header  |  1992-12-18  |  11KB  |  338 lines

  1. /* 
  2.  * devConsole.c --
  3.  *
  4.  *    This module provides special mechanisms to make a Sun
  5.  *    console keyboard+display usable as a Sprite terminal.
  6.  *    For example, it maps keystroke events to ASCII characters
  7.  *    and draws output characters on the screen.
  8.  *
  9.  * Copyright 1989 Regents of the University of California
  10.  * Permission to use, copy, modify, and distribute this
  11.  * software and its documentation for any purpose and without
  12.  * fee is hereby granted, provided that the above copyright
  13.  * notice appear in all copies.  The University of California
  14.  * makes no representations about the suitability of this
  15.  * software for any purpose.  It is provided "as is" without
  16.  * express or implied warranty.
  17.  */
  18.  
  19. #ifndef lint
  20. static char rcsid[] = "$Header: /cdrom/src/kernel/Cvsroot/kernel/dev/sun4.md/devConsole.c,v 9.6 92/08/03 18:05:02 mgbaker Exp $ SPRITE (Berkeley)";
  21. #endif /* not lint */
  22.  
  23. #include "sprite.h"
  24. #include "dev.h"
  25. #include "tty.h"
  26. #include "z8530.h"
  27. #include "machMon.h"
  28. /*
  29.  * Two tables are used for mapping keystrokes to ASCII characters.  One
  30.  * identifies the ASCII character associated with an unshifted key, and
  31.  * the other identifies the ASCII character associated with a shifted
  32.  * key.  A few special values are used for keys like SHIFT and CONTROL.
  33.  * The function keys are ignored here (KDB_NO_KEY);  since this keyboard
  34.  * code is only used between when the machine is booted and when the
  35.  * window system is started, the function keys shouldn't be needed.
  36.  */
  37.  
  38. #define KBD_NO_KEY    200
  39. #define KBD_SHIFT    201
  40. #define KBD_CONTROL    202
  41. #define KBD_CAPS_LOCK    203
  42. #define KBD_CONSOLE_CMD    204
  43. #define KBD_ALL_KEYS_UP    205
  44.  
  45. static unsigned char unshifted[] = {
  46. /*   0 */    KBD_NO_KEY,    KBD_CONSOLE_CMD,KBD_NO_KEY,      KBD_NO_KEY,
  47. /*   4 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  48. /*   8 */    KBD_NO_KEY,     KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  49. /*  12 */     KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  50. /*  16 */    KBD_NO_KEY,     KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  51. /*  20 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  52. /*  24 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  53. /*  28 */    KBD_NO_KEY,    '\033',        '1',        '2',
  54. /*  32 */    '3',        '4',        '5',        '6', 
  55. /*  36 */    '7',        '8',        '9',        '0',
  56. /*  40 */    '-',        '=',        '`',        '\b',
  57. /*  44 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  58. /*  48 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  59. /*  52 */    KBD_NO_KEY,    '\t',        'q',        'w',
  60. /*  56 */    'e',        'r',        't',        'y', 
  61. /*  60 */    'u',        'i',        'o',        'p',
  62. /*  64 */    '[',        ']',        '\177',        KBD_NO_KEY, 
  63. /*  68 */    KBD_NO_KEY,    KBD_NO_KEY,     KBD_NO_KEY,    KBD_NO_KEY,
  64. /*  72 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  65. /*  76 */    KBD_CONTROL,    'a',         's',        'd',
  66. /*  80 */    'f',        'g',        'h',        'j', 
  67. /*  84 */    'k',        'l',        ';',        '\'',
  68. /*  88 */    '\\',        '\r',        KBD_NO_KEY,    KBD_NO_KEY, 
  69. /*  92 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  70. /*  96 */    KBD_NO_KEY,    KBD_CAPS_LOCK,    KBD_NO_KEY,    KBD_SHIFT,
  71. /* 100 */    'z',        'x',        'c',        'v',
  72. /* 104 */    'b',        'n',        'm',        ',', 
  73. /* 108 */    '.',        '/',        KBD_SHIFT,    '\n',
  74. /* 112 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  75. /* 116 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_CAPS_LOCK,
  76. /* 120 */    KBD_NO_KEY,     ' ',        KBD_NO_KEY,     KBD_NO_KEY, 
  77. /* 124 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_ALL_KEYS_UP
  78. };
  79.  
  80. static unsigned char shifted[] = {
  81. /*   0 */    KBD_NO_KEY,    KBD_CONSOLE_CMD,KBD_NO_KEY,      KBD_NO_KEY,
  82. /*   4 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  83. /*   8 */    KBD_NO_KEY,     KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  84. /*  12 */     KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  85. /*  16 */    KBD_NO_KEY,     KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  86. /*  20 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  87. /*  24 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  88. /*  28 */    KBD_NO_KEY,    '\033',        '!',        '@',
  89. /*  32 */    '#',        '$',        '%',        '^', 
  90. /*  36 */    '&',        '*',        '(',        ')',
  91. /*  40 */    '_',        '+',        '~',        '\b',
  92. /*  44 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  93. /*  48 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  94. /*  52 */    KBD_NO_KEY,    '\t',        'Q',        'W',
  95. /*  56 */    'E',        'R',        'T',        'Y', 
  96. /*  60 */    'U',        'I',        'O',        'P',
  97. /*  64 */    '{',        '}',        '\377',        KBD_NO_KEY, 
  98. /*  68 */    KBD_NO_KEY,    KBD_NO_KEY,     KBD_NO_KEY,    KBD_NO_KEY,
  99. /*  72 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  100. /*  76 */    KBD_CONTROL,     'A',         'S',        'D',
  101. /*  80 */    'F',        'G',        'H',        'J', 
  102. /*  84 */    'K',        'L',        ':',        '"',
  103. /*  88 */    '|',        '\r',        KBD_NO_KEY,    KBD_NO_KEY, 
  104. /*  92 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,
  105. /*  96 */    KBD_NO_KEY,    KBD_CAPS_LOCK,    KBD_NO_KEY,    KBD_SHIFT,
  106. /* 100 */    'Z',        'X',        'C',        'V',
  107. /* 104 */    'B',        'N',        'M',        '<', 
  108. /* 108 */    '>',        '?',        KBD_SHIFT,    '\n',
  109. /* 112 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY, 
  110. /* 116 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_CAPS_LOCK,
  111. /* 120 */    KBD_NO_KEY,     ' ',        KBD_NO_KEY,     KBD_NO_KEY, 
  112. /* 124 */    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY,    KBD_NO_KEY
  113. };
  114.  
  115. /*
  116.  * Last known state of the keyboard:
  117.  */
  118.  
  119. static Boolean    controlDown    = FALSE;
  120. static Boolean    shiftDown    = FALSE;
  121. static Boolean    capsLock    = FALSE;
  122. static Boolean    consoleCmdDown    = FALSE;
  123.  
  124. /*
  125.  *----------------------------------------------------------------------
  126.  *
  127.  * DevConsoleRawProc --
  128.  *
  129.  *    This procedure is invoked from the Td module to handle control
  130.  *    requests on the raw side of the console.  This procedure is
  131.  *    special because output to the console is not transmitted on
  132.  *    a serial line:  it gets drawn directly on the screen by calling
  133.  *    a procedure in the boot ROM.
  134.  *
  135.  * Results:
  136.  *    The return value is the number of bytes returned to the caller
  137.  *    at outBuffer.
  138.  *
  139.  * Side effects:
  140.  *    Depends on the control operation.  Most likely effect is to
  141.  *    draw data on the screen.
  142.  *
  143.  *----------------------------------------------------------------------
  144.  */
  145.  
  146. /* ARGSUSED */
  147. int
  148. DevConsoleRawProc(ptr, operation, inBufSize, inBuffer, outBufSize, outBuffer)
  149.     Address ptr;
  150.     int operation;        /* What to do:  TD_RAW_OUTPUT_READY etc. */
  151.     int inBufSize;        /* Size of input buffer for operation. */
  152.     char *inBuffer;        /* Input buffer. */
  153.     int outBufSize;        /* Size of output buffer for operation. */
  154.     char *outBuffer;        /* Output buffer. */
  155. {
  156.     register DevZ8530 *zPtr;
  157.     char buf[TTY_OUT_BUF_SIZE];
  158.     int c, i;
  159.  
  160.     zPtr = (DevZ8530 *) ptr; /* Information about keyboard device. */
  161.     if (operation != TD_RAW_OUTPUT_READY) {
  162.     return 0;
  163.     }
  164.     for (i = 0; i < sizeof buf; ++i) {
  165.  
  166.     /*
  167.      * Note:  must call DevTtyOutputChar directly, rather than calling
  168.      * indirectly through zPtr->outputProc:  zPtr->outputProc must point
  169.      * to a dummy procedure so the Z8530 interrupt handler won't grab
  170.      * characters and output them to the keyboard.
  171.      */
  172.  
  173.     c = DevTtyOutputChar(zPtr->ttyPtr);
  174.     if (c == -1) {
  175.         break;
  176.     }
  177.     buf[i] = c & 0x7f;
  178.     }
  179.     if (i > 0) {
  180.     if (!sys_DontPrint) {
  181.         (*romVectorPtr->fbWriteStr)(buf, i);
  182.     }
  183.     }
  184.     return 0;
  185. }
  186.  
  187. /*
  188.  *----------------------------------------------------------------------
  189.  *
  190.  * DevConsoleConvertKeystroke --
  191.  *
  192.  *    Given a keystroke consisting of key number and up/down indication,
  193.  *    convert it to the ASCII character that was typed.
  194.  *
  195.  * Results:
  196.  *    The return value is the ASCII character corresponding to the
  197.  *    keystroke, or -1 if the keystroke didn't correspond to an
  198.  *    ASCII character (e.g. it was an upstroke, or a downstroke on
  199.  *    the SHIFT key), or -2 if the keystroke formed part of an L1-
  200.  *    console command, which means higher-level software should
  201.  *    ignore it.
  202.  *
  203.  * Side effects:
  204.  *    Internal state about the keyboard (such as whether a shift key is
  205.  *    down) is updated.  L1- strokes are turned into console commands
  206.  *    and executed.
  207.  *
  208.  *----------------------------------------------------------------------
  209.  */
  210.  
  211. int
  212. DevConsoleConvertKeystroke(value)
  213.     int value;            /* Character that arrived from UART:
  214.                  * identifies which key, and whether up
  215.                  * or down transition. */
  216. {
  217.     Boolean down;
  218.     int keyIndex;
  219.     int asciiChar;
  220.  
  221.     /*
  222.      * Figure out what key number changed, and whether it went up
  223.      * or down.
  224.      */
  225.  
  226.     keyIndex = value & 0x7f;
  227.     if (value & 0x80) {
  228.     down = FALSE;
  229.     } else {
  230.     down = TRUE;
  231.     }
  232.  
  233.     /*
  234.      * See if the state of the shift, control, or caps-lock keys changed.
  235.      */
  236.  
  237.     asciiChar = unshifted[keyIndex];
  238.     switch (asciiChar) {
  239.     case KBD_CONTROL:
  240.         controlDown = down;
  241.         break;
  242.     case KBD_SHIFT:
  243.         shiftDown = down;
  244.         break;
  245.     case KBD_CAPS_LOCK:
  246.         if (down) {
  247.         capsLock = !capsLock;
  248.         }
  249.         break;
  250.     case KBD_CONSOLE_CMD:
  251.         consoleCmdDown = down;
  252.         return -2;
  253.         break;
  254.     case KBD_ALL_KEYS_UP:
  255.         controlDown = shiftDown = capsLock = consoleCmdDown = FALSE;
  256.         break;
  257.     }
  258.  
  259.     /*
  260.      * From here on, up-transitions are not important, nor are transitions
  261.      * on keys other than ASCII.
  262.      */
  263.  
  264.     if (!down || (asciiChar >= KBD_NO_KEY)) {
  265.     return -1;
  266.     }
  267.  
  268.     if (shiftDown || capsLock) {
  269.     asciiChar = shifted[keyIndex];
  270.     }
  271.     if (controlDown) {
  272.     asciiChar &= 0x1f;
  273.     }
  274.  
  275.     if (consoleCmdDown) {
  276.     consoleCmdDown = 0;
  277.     Dev_InvokeConsoleCmd(asciiChar);
  278.     return -2;
  279.     }
  280.     return asciiChar;
  281. }
  282.  
  283. /*
  284.  *----------------------------------------------------------------------
  285.  *
  286.  * DevConsoleInputProc --
  287.  *
  288.  *    This procedure is invoked at interrupt level to handle input
  289.  *    characters from the keyboard UART.
  290.  *
  291.  * Results:
  292.  *    None.
  293.  *
  294.  * Side effects:
  295.  *    The input character (which identifies a key transition) is
  296.  *    converted to an ASCII character, which is then added to the
  297.  *    input buffer for the console terminal device.  Or, if this
  298.  *    is a console command then the console command is executed
  299.  *    and the keystroke is ignored.
  300.  *
  301.  *----------------------------------------------------------------------
  302.  */
  303.  
  304. void
  305. DevConsoleInputProc(ttyPtr, value)
  306.     DevTty *ttyPtr;        /* Higher-level information about the
  307.                  * terminal. */
  308.     int value;            /* Character that arrived from UART:
  309.                  * identifies which key, and whether up
  310.                  * or down transition. */
  311. {
  312.     int asciiChar;
  313.  
  314.     /*
  315.      * Ignore special characters such as break, then convert a keystroke
  316.      * into an ASCII character.
  317.      */
  318.  
  319.     if (value & ~0xff) {
  320.     return;
  321.     }
  322.     asciiChar = DevConsoleConvertKeystroke(value);
  323.  
  324.     /*
  325.      * If the normal (ASCII stream) handler is in place for the console,
  326.      * then input the ASCII character.  Otherwise the console is being
  327.      * used in "mouse" mode:  input the raw keystroke.
  328.      */
  329.  
  330.     if (asciiChar != -2) {
  331.     if (ttyPtr->inputProc != (void (*)()) NIL) {
  332.         DevTtyInputChar(ttyPtr, value);
  333.     } else if (asciiChar >= 0) {
  334.         DevTtyInputChar(ttyPtr, asciiChar);
  335.     }
  336.     }
  337. }
  338.